SSIS-Carregando arquivo texto

Preliminares

Se vamos fazer um projeto no SSIS vamos começar por um bem básico, carregar um arquivo texto para uma tabela do Microsoft SQL Server. Básico, só isso mesmo.

Num documento anterior discutimos alguns detalhes sobre a metodologia mínima para implementar bons serviços no MSSQL Server, como tratamento de erros. No final mencionei como instalar o Visual Studio Community Edition e o Sql Server Integration Services dentro dele. Agora vamos a um exemplo de como criar um pacote de funcionalidades...um simples, que vai apenas importar um arquivo texto para uma tabela sql. Note que o importante é aprender e muitos componentes seguem a mesma metodologia apresentada aqui.

Vamos mencionar passo a passo do que deve ser feito para criar esse processo de SSIS.

Requisitos

1-Um arquivo texto que será a origem das informações. Neste exemplo eu usarei este:

NOME_EMPRESA;PECA;SALDO;QTD_ESTOQUE;DT_GERACAO;
EMPRESAW;70987654345543;2.00;2023-02-13 00:00:00.000;
EMPRESAX;87676554657565;6.00;2023-02-13 00:00:00.000;
EMPRESAY;77564599887877;9.35;2023-02-13 00:00:00.000;
EMPRESAZ;54432235665655;3.00;2023-02-13 00:00:00.000;

É um estoque de peças, pequeno, só com 4 itens...para teste tá ótimo.

Note que cada campo é separado por ;. Evite usar virgulas, o famoso CSV ( comma separated values ) porque é bom para americanos mas péssimos para brasileiros porque nossa moeda usa , como separador.

1-Você precisa de um servidor SQL que será o destino das informações

2-Do Visual Studio Community Edition com a Extensão Analysis services

Se você tem esses recursos abra o Visual Studio ... Selecione criar novo projeto

Em seguida selecione criar um novo projeto do Integration Services.

Caso você não encontre essa opção (nessa imagem a gente só tá vendo a opção porque já usei), digite na aba pesquisar 'Integration Services'

Clique no modelo de projeto do Integration Services (grafado em vermelho).
Selecione o primeiro item...Integration Services Project. Crie uma pasta para seus projetos e dê um nome ao seu novo projeto...finalize a criação do novo projeto. Neste momento você deve estar na tela principal do SSIS.

Se você ficou assustado com tanta tranqueira, fique calmo, eu também. Mas como lhe disse anteriormente, a ferramenta tem uma ampla gama de recursos e eles estão ai, pra você usar...é só saber como e vou te mostrar que é bem mais simples que você pensa.

Definindo a fonte de dados

A fonte de dados é o nosso arquivo texto com o conteúdo mencionado acima.

1-Clique na aba superior da tela : ‘Data Flow’

2-No momento no seu projeto você ainda não tem nenhuma tarefa designada para o data flow. Clique no link ‘No Data Flow...’ no centro da página

A sua janela agora deverá ficar branca indicando que agora há uma espaço para o seu projeto em branco para você poder trabalhar.

3-Vá no SSIS toolbox ( a esquerda da tela) e abra o item ‘Outras Origens’ do ToolBox.

4-Selecione ‘Origem de Arquivo Simples’ >

5-Arraste para o centro da tela. Você deve ter a seguinte tela:

Pela imagem acima vemos 2 setinhas para baixo, uma em azul que é para o que deve ser feito em caso de sucesso e a vermelha é o que deve ser feito em caso de erro. Mas peraí...não chegamos lá ainda...vamos definir direitinho nossa fonte de dados.

6-AgoraClique 2 vezes na caixinha branca inserida na sua tela - Origem de Arquivo Simples.

Normalmente abre esta tela mas algumas vezes pulou para a tela seguinte.

Clique no botão new que uma nova tela se abrirá.

7-O primeiro item a ser informado é o nome do arquivo.

8-O segundo item é o formato do Arquivo. Como mencionei acima ele é delimitado (os campos são separados por) ponto-e-vírgula.

Observe que a caixa 'Nomes de Coluna na primeira linha de dados' está clicado. Isto define que os cabeçalhos das colunas a serem importadas.
Mais tarde esses nomes serão utilizados para direcionar os dados para os campos corretos da tabela no MS SQL.

9-Agora clique em ‘Colunas’ à esquerda da tela. Você deverá ver as colunas separadas bonitinhas.

Se você não viu as colunas separadas com valores coerentes, tudo certinho, pode voltar e acertar o arquivo texto, está errado.

Podemos notar que tem uma coluna Chamada 'Coluna 4' que na realidade não existe nos nossos dados...foi o software importador que definiu que tem uma coluna depois do ponto-e-virgula final de cada frase e que na realidade não tem. Isso significa que além do ponto-e-virgula ele aceitou a mudança de linha ( CrLf )como delimitador. Se quiser definir que não é para importar essa 'coluna fantasma', clique no item 'Avançado' na aba esquerda da tela.

10-Se você quiser fazer a última verificação clique no item 'Visualização' do menu lateral esquerdo da tela. Você deverá visualizar os dados da tabela perfeitamente como mostrado abaixo.

Xuxu beleza? Agora clique no botão 'OK' e pra dizer que não disse Agora clique no botão 'OK' novamente. Finalizamos o arquivo fonte de dados. Se tudo ocorreu bem võcê terá sua fonte de dados definida exibida assim:

Destino dos dados

13-Nosso destino dos dados é o servidor MS SQL, portanto vamos definir a conexão com o servidor SQL:
No toolbox ( à esquerda da tela) clique no item ‘Assistente de Destino’ ( No topo da página). Nele definimos as conexões com os destinos dos dados.

Veja que maravilha...podemos exportar para um Excel, para um banco de dados...ferramenta fantástica.

14-Selecione SQL Server e clique no item new. Será aberta a tela do gerenciador de conexões.

15-Esse item você deve estar careca de ver define a conexão com o destino dos dados. Clique no item provedor no topo da tela e selecione o destino.

16-No topo temos as conexões com o Access do pacote Office. Depois temos as fontes do analysis services.Temos o OLEDB Provider para Microsoft SQL Server e no meu micro tem instalado o Client Oracle por isso aparece o Oracle Provider. Esta lista dependerá do que você tem instalado na sua maquina...como mysql, postgre, etc.

17-Nosso destino é o servidor SQL portanto selecionei 'SQL Server Native client'.

A seguir será aberto a tela de configuração do SQL Native Client :

No meu caso eu escolhi:
No Servidor : Digitei o IP do meu servidor mas pode ser o nome se o dns resolver.
Authentication : SQL Server Authentication
Digitei usuário e senha do meu servidor SQL nas caixas 'User Name' e 'Password' respectivamente.
Na caixa 'Select or Enter a database Name' escolhi a base de dados que eu quero que os dados sejam importados.
Clique no botão 'Testar Conexão' e será exibida a mensagem abaixo:

18-Clique no botão OK e a definição do destino das informações do arquivo texto está definido. Sendo assim temos agora a origem e o destino dos dados.

19-Clique na caixa da fonte de dados ('Origem de arquivo simples') e você verá que temos 2 setas. Uma azul para tudo OK e outra vermelha para no caso de erro. Clique na setinha azul da caixa, mais precisamente, na bolinha da seta azul e a arraste para a caixa de baixo. A imagem passará a ser essa :

Só pra quebrar a cara, clique na setinha verde no topo da sua tela (Iniciar) que a ferramenta executará o que foi definido.

Quebrou a cara? Viu o erro que deu ? Legal mas valeu ...Note que nada foi executado, digamos que não passou na compilação do pacote, na verificação. Por outro lado há uma dica boa do erro que aconteceu, veja a dica.

Isso ai, tá na reta de chegada...falta pouco. Temos a origem e o destino mas até agora só definimos o banco de dados de destino, falta definir a tabela de destino dos dados.

20-Agora clique 2 vezes na caixa 'Destino do OleDB'. Veja que o servidor está definido mas a tabela de destino não.

21-Como você está numa ferramenta de alto-padrão, você não vai precisar ir no sql criar uma tabela copiando cabeçalho por cabeçalho...que chatice...clique no botão 'New' em frente a mensagem 'Name of the table or the view'. Será exibida o comando de criação da nova tabela onde os dados serão exportados para o MS SQL.

22-Infelizmente nem tudo é um mar de rosas. Acerte nesse comando:
1-O nome da tabela: mude de 'Destino OLE DB' para 'Peças', se desejar.
Vá no item 9 desta página e verá que os campos:
QTD_ESTOQUE é um número não um texto. Mude o campo para decimal 10.2 e o campo DT_Geracao para date.
A coisa fica assim:

23-Pra ter certeza que a importação irá da fonte para o destino corretamente, clique no item 'Mappings'

24-Agora você tem certeza que o campo x do arquivo texto ira para o campo x da tabela t do banco de dados. Clique no botão OK.

Clique novamente em executar o pacote (veja item 19). Você vai ter um erro.

25-Puxa, aconteceu um erro...como eu sei o que foi ? Clique no botão stop no topo da tela.

Veja se no rodapé da sua página aparece a mensagem de erro. Ela é exibida na caixa de saída de mensagens.
Role para cima e para baixo que você vai encontrar o erro.

Pelas mensagens de erro tá mais que claro que no campo DT_GERACAO tem um valor inválido que causou o erro.

Mas é claro que tem que dar erro...você está copiando campos de um arquivo texto e está querendo que o processo converta eles para número ( QTD_ESTOQUE ), data ( DT_GERACAO ) automaticamente ? Ele até poderia fazer isso facinho mas não foi isso que você instruiu ele a fazer.

26-Vamos corrigir o erro...vamos fazer uma conversão de tipo do dados. Remova a setinha ligando os 2 itens, 'Origem de Arquivo Simples' e 'Destino OLE DB'

27-Vá na caixa de ferramentas ( Toolbox ) e selecione 'Conversão de dados' e arraste para o meio dos 2 componentes.

28-Clique na flechinha azul da caixa 'Origem de Arquivo simples' e a mova para o novo item, 'Conversão de dados'

29-Agora Clique 2 vezes no item 'Conversão de dados'. Selecione as colunas que deseja converter, no nosso exemplo, QTD_ESTOQUE, DT_GERACAO. No momento foram criadas 2 colunas 'transitórias' chamadas 'Copy de ...nome da coluna' mas com o mesmo tipo da original, cadeia de caracteres.

30-Clique agora 2 vezes no campo 'Data Type e selecione o tipo de dados desejado'. No campo QTD_ESTOQUE escolhi decimal e no campo DT_GERACAO escolhi Date.

31-Agora arraste a setinha azul do box 'Conversão de dados' para o box 'Destino OLE DB'

32-Clique 2 vezes no box 'Destino OLE DB'. Selecione a aba 'Mappings' na lateral esquerda da caixa. Você verá que ele aponta para os campos antigos onde tem correspondência direta dos nomes

33-Vimos que está errado porque mudamos os tipos das colunas QTD_ESTOQUE e DT_GERACAO. Clique nas correspondências (setas) e clique com o botão do mouse e selecine 'Delete Selected Mappings'. Você ficará com isso...

Agora clique nas colunas convertidas e arraste para as colunas de destino.A 'Copy of QTD_ESTOQUE' para QTD_ESTOQUE e 'Copy of DT_GERACAO' para DT_GERACAO. A coisa fica assim:

Clique no botão 'OK' rode o pacote novamente (Veja item 19).

Cara bom taí. Foi que nem quiabo.

Indo no SQL Server Management Studio e dando um select na tabela espero encontrar os dados...

Opa...peraí...a coluna QTD_ESTOQUE está errada....onde era 2 ela colocou 200...sabe dizer qual o erro?

Fácil né, quem manda colocar . para separar casas decimal de moeda numa ferramenta que está usando a linguagem em português.
Como primeiro desafio veja se na conversão você consegue acertar esse erro.

Que achou, gostou da explicação? E o mais legal é que se der um pau você não estará tão perdido assim porque nos exemplos provoquei erros de propósito. Vá em frente...Boa sorte.

Se acostume com os erros

Tudo que envolve idioma pode dar erro...datas, conjunto de caracteres (maldito windows 1252 versus UTF-8), formato da moeda.
Felizmente a ferramenta conta com um conjunto completo de soluções para qualquer problema..não se intimide...erros são comuns e facilmente corrigíveis...só não deixe o erro chegar até o chefe ou a gerencia.